<?php
namespace Fox\Core;

use Fox;

/**
 * Fox\Core\Request
 * 数据请求解析类
 * 
 * @author keluo <keluo@focrs.com>
 * @copyright 2017 Focrs, Co.,Ltd
 * @package Fox
 * @since 2017-9-28
 */
class Request {
    
    public $route; // 当前路由
    public $base; // 当前请求基本url
    
    private $_get = [];
    private $_post = [];
    
    private static $_instance;
    
    private function __construct() {
        $this->Parse();
    }
    
    public function __clone() {}
    
    /**
     * 调用\Fox\Core\Request实例
     * @return \Fox\Core\Request
     */
    public static function Instance() {
        if(!self::$_instance instanceof self) {
            self::$_instance = new self;
        }
        return self::$_instance;
    }
    
    /**
     * 
     * 获取GET请求中指定参数值或所有数据
     * @param string $key 参数名
     * @return mixed
     */
    public function Get($key = null) {
        if(is_null($key)) return $this->_get;
        if(empty($this->_get)) return false;
        foreach($this->_get as $k=>$v) {
            if(0 == strcasecmp($k, $key)) return $this->_get[$k];
        }
        return false;
    }
    
    /**
     * 获取POST请求中指定参数值或所有数据
     * @param string $key 参数名
     * @return mixed
     */
    public function Post($key = null) {
        if(is_null($key)) return $this->_post;
        if(isset($this->_post[$key])) {
            return is_array($this->_post[$key]) ? $this->_post[$key] : trim($this->_post[$key]);
        }
        return false;
    }
    
    /**
     * 路由重定向
     * @param string $route 路由地址
     * @param array $params 参数
     * @param boolean $exit 是否立即终止程序执行
     * @example
     * Fox::Request()->Route('product', ['id' => 1]);
     */
    public function Route($route = '', $params = [], $exit = true) {
        $this->Redirect(Fox::Url()->Create($route, $params), $exit);
    }
    
    /**
     * url重定向
     * @param string $url 完整url地址
     * @param boolean $exit 是否立即终止程序执行
     */
    public function Redirect($url, $exit = true) {
        header('Location: '.$url);
        $exit && exit;
    }
    
    /**
     * 检查当前请求方式
     * @string $method GET|POST|PUT|DELETE
     */
    public function Is($method) {
        return 0 == strcasecmp($_SERVER['REQUEST_METHOD'], $method);
    }
    
    /**
     * 解析当前请求
     */
    private function Parse() {
        $this->base = trim(str_replace('index.php', '', $_SERVER['SCRIPT_NAME']), '/');
        $this->base = $this->base ? '/'.$this->base : '';
        
        preg_match('/([\/\w]+)/', $_SERVER['REQUEST_URI'], $matches);
        $this->route = trim(substr($matches[1], strlen($this->base)), '/');
        
        $this->_get = array_map(function($value) {
            return trim($value);
        }, $_GET);
        
        if($this->Is('POST') && !empty($_POST)) {
            $this->_post = array_map(function($value) {
                return is_array($value) ? $value : trim($value);
            }, $_POST);
        }
    }
}